<?php
/**
 * Created by PhpStorm.
 * User: hhcycj
 * Date: 2018/4/4
 * Time: 15:38
 */


// 面向过程写法

// http://local.hhcycj.com:8812/ws_client.html

$server = new swoole_websocket_server("0.0.0.0", 8812);

//$server->set([
//    'websocket_subprotocol' => 'chat',
//]);

$server->set([
    'document_root' => '/var/www/swoole/data',
    'enable_static_handler' => true,
]);

/**
 * 当WebSocket客户端与服务器建立连接并完成握手后会回调此函数。
 */
$server->on('open', function (swoole_websocket_server $server, $request) {
    echo "open: fd{$request->fd}\n";
});


/**
 * 当服务器收到来自客户端的数据帧时会回调此函数。
 * $frame 是swoole_websocket_frame对象，包含了客户端发来的数据帧信息
 */
$server->on('message', function (swoole_websocket_server $server, $frame) {
    /*
        $frame->fd，客户端的socket id，使用$server->push推送数据时需要用到
        $frame->data，数据内容，可以是文本内容也可以是二进制数据，可以通过opcode的值来判断
        $frame->opcode，WebSocket的OpCode类型，可以参考WebSocket协议标准文档
        $frame->finish， 表示数据帧是否完整，一个WebSocket请求可能会分成多个数据帧进行发送（底层已经实现了自动合并数据帧，现在不用担心接收到的数据帧不完整）
   */
    echo "message: receive from {$frame->fd}:{$frame->data}, opcode:{$frame->opcode}, finish:{$frame->finish}\n";
    $server->push($frame->fd, "this is server");
});

$server->on('close', function ($ser, $fd) {
    echo "client {$fd} closed\n\n";
});

$server->start();